{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fashion category classification \n",
    "- Examples using Fashion-MNIST database in Keras"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from keras.models import Model\n",
    "from keras.datasets import fashion_mnist\n",
    "from keras.utils.np_utils import to_categorical\n",
    "from keras.layers import Input, Dense, Activation, BatchNormalization\n",
    "from keras import optimizers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Dataset\n",
    "- Fashion-MNIST dataset in Keras\n",
    "- doc: https://keras.io/datasets/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28)\n",
      "(10000, 28, 28)\n",
      "(60000,)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape)\n",
    "print(X_test.shape)\n",
    "print(y_train.shape)\n",
    "print(y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nW+udtQXV3WbblwbnmvXPQ6b8NiX6zPr8RI+z9oPkR2bb5+Ee6jsWPPITeYrhJ/IUw0/kKYafyFMM\nP5GnGH4iTzH8RJ4q7zi/2MtzL/mnjWbzpckPnbUhtadQho3jh43bWqZV2cs0j6Tth7k7bU/ZDXN6\nzX5n7fqGzWbb9Y8tMeuXpu4y659c8Z9mvX3YvZV1T8b+uW/adYVZ3/RZs1m/cP4uZ+2c5F6zbdi5\nFcl4yqxb06wBYDDn/n19J2Wf/1AqPPITeYrhJ/IUw0/kKYafyFMMP5GnGH4iTzH8RJ4q69LddXOa\n9dRb/85Zb7vzX8z2z/Re6Kw119p7iZ5cfcCsz4zb2z1bkjF7zPeMhD3m+9LgSWb9tUNnmvXvJDud\ntYTY23tfPuVjs37bT+4265lae5Xo/vnu40um3v7dazj3oFm/67RXzXq18bMfytrj+GGPW9gW3GGs\nNRiSMXtb9IeWX++svd35FPqG93HpbiJyY/iJPMXwE3mK4SfyFMNP5CmGn8hTDD+Rp0Ln84tIM4Cn\nATQBUABtqvqoiDQC+BWA+QA6AdyoquaeybE0MKXLPb75Un+L2ZcFde61zg+k7fXpf3f4HLN+Up29\n3bO11fRpxnx6ANicmm7WX+75tlk/sc5ev74rPc1ZO5iuN9sOGfPKAeDJRx426w912ev+X9+4yVk7\nt9oexz+Us49NW0P2OxjI1TprKbXXd+gLOQ8gafw+AEBa7WjFjS2+p8fscwj6z5nprGW78l+iI58j\nfwbA3aq6CMCFAO4UkUUA7gXQrqoLAbQHXxPRcSI0/Kq6T1U3BZcHAGwDMA/ACgBrgputAXDdZHWS\niErvmN7zi8h8AOcB2ACgSVX3BaX9GHtbQETHibzDLyJTAfwGwI9V9Yg3oTo2QWDCE7VFZJWIdIhI\nR2ZksKjOElHp5BV+EUlgLPi/UNXngqu7RGRuUJ8LYMKdD1W1TVVbVbW1qsb+8ImIyic0/CIiAJ4E\nsE1Vx3/0+yKAlcHllQBeKH33iGiy5DMucAmAWwFsEZEv14G+D8ADAP5bRG4H8CmAG8O+UXw0h+Tu\nEWc9p/ZMxFcPuKe2NtUOmG1bkrvN+vYhe9hoy/CJztqmqm+Zbevi7u29AWBatT0luL7K/ZgBwKyE\n+2c/pcbeitqa9goAG1P2z/ZXs18z659l3Eui/3bwdLPt1iH3Yw4AM0KWTN/S724/lLG3TR/J2tFI\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16ae49d01d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Label:  9\n"
     ]
    }
   ],
   "source": [
    "plt.imshow(X_train[0])\n",
    "plt.show()\n",
    "print('Label: ', y_train[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16ae4aa44a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Label:  0\n"
     ]
    }
   ],
   "source": [
    "plt.imshow(X_train[1])\n",
    "plt.show()\n",
    "print('Label: ', y_train[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Simple MLP\n",
    "- Naive MLP classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2])\n",
    "X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = to_categorical(y_train)\n",
    "y_test = to_categorical(y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 784)\n",
      "(10000, 784)\n",
      "(60000, 10)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape)\n",
    "print(X_test.shape)\n",
    "print(y_train.shape)\n",
    "print(y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def simple_mlp():\n",
    "    inputs = Input(shape = (X_train.shape[1],))\n",
    "    l = Dense(100, kernel_initializer = 'he_normal')(inputs)\n",
    "    l = Activation('selu')(l)\n",
    "    l = BatchNormalization()(l)\n",
    "    l = Dense(100, kernel_initializer = 'he_normal')(l)\n",
    "    l = Activation('selu')(l)\n",
    "    l = BatchNormalization()(l)\n",
    "    outputs = Dense(10, activation = 'softmax')(l)\n",
    "    \n",
    "    adam = optimizers.adam(lr = 0.001)\n",
    "    model = Model(inputs = inputs, outputs = outputs)\n",
    "    model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model = simple_mlp()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 2min 14s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "history = model.fit(X_train, y_train, epochs = 100, batch_size = 200, validation_split = 0.3, verbose = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16af9abe9b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['acc'])\n",
    "plt.plot(history.history['val_acc'])\n",
    "plt.ylabel('accuracy')\n",
    "plt.xlabel('epochs')\n",
    "plt.legend(['train', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 9824/10000 [============================>.] - ETA: 0s"
     ]
    }
   ],
   "source": [
    "results = model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy:  0.8694\n"
     ]
    }
   ],
   "source": [
    "print('Test accuracy: ', results[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Reduced Dimension MLP\n",
    "- Reduce the dimensionality of the training data by autoencoder, and then classify using MLP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def auto_encoder_model(code_dim):    \n",
    "    inputs = Input(shape = (X_train.shape[1],), name = 'input')                         # input layer\n",
    "    code = Dense(code_dim, activation = 'relu', name = 'code')(inputs)                  # hidden layer => represents \"codes\"\n",
    "    outputs = Dense(X_train.shape[1], activation = 'softmax', name = 'output')(code)    # output layer\n",
    "\n",
    "    auto_encoder = Model(inputs = inputs, outputs = outputs)\n",
    "\n",
    "    encoder = Model(inputs = inputs, outputs = code)\n",
    "\n",
    "    decoder_input = Input(shape = (code_dim,))\n",
    "    decoder_output = auto_encoder.layers[-1]\n",
    "    decoder = Model(inputs = decoder_input, outputs = decoder_output(decoder_input))\n",
    "\n",
    "    auto_encoder.compile(optimizer='adam', loss='binary_crossentropy')\n",
    "    return encoder, decoder, auto_encoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 6min 32s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "encoder, decoder, auto_encoder = auto_encoder_model(100)     # set code dimension as 100 (784 -> 100)\n",
    "auto_encoder.fit(X_train, X_train, epochs = 100, batch_size = 100, validation_data = (X_test, X_test), verbose = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train_re = encoder.predict(X_train)\n",
    "X_test_re = encoder.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def dim_reduced_mlp():\n",
    "    inputs = Input(shape = (X_train_re.shape[1],))\n",
    "    l = Dense(100, kernel_initializer = 'he_normal')(inputs)\n",
    "    l = Activation('selu')(l)\n",
    "    l = BatchNormalization()(l)\n",
    "    l = Dense(100, kernel_initializer = 'he_normal')(l)\n",
    "    l = Activation('selu')(l)\n",
    "    l = BatchNormalization()(l)\n",
    "    outputs = Dense(10, activation = 'softmax')(l)\n",
    "    \n",
    "    adam = optimizers.adam(lr = 0.001)\n",
    "    model = Model(inputs = inputs, outputs = outputs)\n",
    "    model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model = dim_reduced_mlp()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 2min 6s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "history = model.fit(X_train_re, y_train, epochs = 100, batch_size = 200, validation_split = 0.3, verbose = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16990de0358>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['acc'])\n",
    "plt.plot(history.history['val_acc'])\n",
    "plt.ylabel('accuracy')\n",
    "plt.xlabel('epochs')\n",
    "plt.legend(['train', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 9600/10000 [===========================>..] - ETA: 0s"
     ]
    }
   ],
   "source": [
    "results = model.evaluate(X_test_re, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy:  0.8352\n"
     ]
    }
   ],
   "source": [
    "print('Test accuracy: ', results[1])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
